package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;


import com.divemotor.ventarepuestosinternet.dao.PromocionDAO;
import com.divemotor.ventarepuestosinternet.model.Promocion;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;

@SuppressWarnings("unchecked")
@Repository(value="promocionDAO")
public class PromocionDAOImpl implements PromocionDAO, Serializable {


	private static final long serialVersionUID = -7321728315299291367L;
	
	@Autowired
	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	@Override
	public List<Promocion> listar() {
		Criteria  criteria = getSessionFactory().getCurrentSession().createCriteria(Promocion.class, "promocion")
				.add(Restrictions.eq("promocion.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()))
				.add(Restrictions.not(Restrictions.eq("estado",
						Constantes.ESTADO_ELIMINADO)))
				.addOrder(Order.asc("promocion.nombre"));
		return  criteria.list();
	}

	@Override
	public List<Promocion> buscar(Promocion promocion) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Promocion.class,"promocion")
				.add(Restrictions.eq("promocion.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()))
		.addOrder(Order.asc("promocion.nombre"));
		
		if(promocion.getCodigo() != null && !promocion.getCodigo().equals("")){
			criteria.add(Restrictions.like("codigo","%"+promocion.getCodigo()+"%").ignoreCase());
		}
		
		if(promocion.getNombre() != null && !promocion.getNombre().equals("")){
			criteria.add(Restrictions.like("nombre","%"+promocion.getNombre()+"%").ignoreCase());
		}
		
		if(!(promocion.getTipoPromocion().getIdTipoPromocion().equals(Constantes.NO_SELECCIONADO))){
			criteria.add(Restrictions.eq("tipoPromocion.idTipoPromocion", promocion.getTipoPromocion().getIdTipoPromocion()));
		}
		
		if(promocion.getEstado() != null && !promocion.getEstado().equals(Constantes.NO_SELECCIONADO.toString())){
			criteria.add(Restrictions.eq("estado", promocion.getEstado()));
		}else{			
			criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		}
		
		return criteria.list();
	}

	@Override
	public String obtenerMaximoNombreImagen() {
		Query query = sessionFactory.getCurrentSession().createQuery("SELECT MAX(urlImagen) FROM Promocion");
		String nombreImagen = (String) query.list().get(0);
		if (nombreImagen == null) {
			nombreImagen = Constantes.PRIMER_NOMBRE_IMAGEN;
		}
		return nombreImagen;
	}

	@Override
	public Promocion obtenerPorId(Promocion promocion) {
		return (Promocion) sessionFactory.getCurrentSession().get(Promocion.class, promocion.getIdPromocion());
	}

	@Override
	public void insertar(Promocion promocion) {
		getSessionFactory().getCurrentSession().persist(promocion);
	}

	@Override
	public void actualizar(Promocion promocion) {
		sessionFactory.getCurrentSession().merge(promocion);
	}

	@Override
	public List<Promocion> listarVigentes(Date fecha) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Promocion.class,"promocion")
				.add(Restrictions.eq("promocion.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()))
				.add(Restrictions.le("promocion.fechaInicio", fecha))
				.add(Restrictions.ge("promocion.fechaFin", fecha));
		return criteria.list();
	}

	@Override
	public List<Promocion> listarVigentesPorTipo(Promocion promocion, Date fecha) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Promocion.class,"promocion")
				.add(Restrictions.eq("promocion.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()))
				.add(Restrictions.le("promocion.fechaInicio", fecha))
				.add(Restrictions.ge("promocion.fechaFin", fecha));
		
		if(!promocion.getTipoPromocion().getIdTipoPromocion().equals(Constantes.NO_SELECCIONADO)){
			criteria.add(Restrictions.eq("promocion.tipoPromocion.idTipoPromocion", promocion.getTipoPromocion().getIdTipoPromocion()));
		}
		return criteria.list();
	}

	@Override
	public List<Promocion> listarPromocionPorCodigo(Promocion promocion) {
		return getSessionFactory().getCurrentSession().createQuery("SELECT p FROM Promocion p WHERE upper(p.codigo) = upper(:codigo)")
				.setParameter("codigo", promocion.getCodigo()).list();
	}
}